package ec.linde.modulos.proyectos;

import java.util.ArrayList;
import java.util.Date;
import java.util.HashMap;
import java.util.List;
import java.util.Map;

import javax.annotation.PostConstruct;
import javax.ejb.EJB;
import javax.faces.bean.ManagedBean;
import javax.faces.bean.ViewScoped;
import javax.faces.model.SelectItem;

import org.primefaces.component.datatable.DataTable;
import org.primefaces.model.LazyDataModel;
import org.primefaces.model.SortOrder;

import ec.linde.enumeraciones.TipoNegocio;
import ec.linde.modulos.proyectos.servicio.ServicioContactoCliente;
import ec.linde.modulos.proyectos.servicio.ServicioContactoContratista;
import ec.linde.modulos.proyectos.servicio.ServicioContratista;
import ec.linde.modulos.proyectos.servicio.ServicioDatosBaseProyectos;
import ec.linde.modulos.proyectos.servicio.ServicioProyecto;
import ec.linde.persistencia.entidades.ProdCabeceraProforma;
import ec.linde.persistencia.entidades.ProdClientes;
import ec.linde.persistencia.entidades.ProdSucursales;
import ec.linde.persistencia.entidades.SeadUsuarios;
import ec.linde.persistencia.entidades.proyectos.ContactoCliente;
import ec.linde.persistencia.entidades.proyectos.ContactoContratista;
import ec.linde.persistencia.entidades.proyectos.Contratista;
import ec.linde.persistencia.entidades.proyectos.Proyecto;
import ec.linde.persistencia.entidades.proyectos.ProyectoContratistaSecundario;
import ec.linde.persistencia.entidades.proyectos.ProyectoProformaSecundaria;

/**
 * TODO: Agregar descripcion
 * 
 * @FechaCreacion: 29/03/2013
 * @author: Alex Carrillo
 * @FechaModificacion: 29/03/2013
 * @author: Alex Carrillo
 * @version: 1.0
 */
@ManagedBean
@ViewScoped
public class ProyectoBean extends PageController {

	private static final long serialVersionUID = 1L;

	/**
	 * Servicios
	 */
	@EJB
	private ServicioProyecto servicioProyecto;
	@EJB
	private ServicioContratista servicioContratista;
	@EJB
	private ServicioDatosBaseProyectos servicioDatosBaseProyectos;
	@EJB
	private ServicioContactoCliente servicioContactoCliente;
	@EJB
	private ServicioContactoContratista servicioContactoContratista;

	/**
	 * Atributos Forma
	 */
	private Proyecto proyecto;
	private Integer idProforma;
	private Integer idProyecto;

	/**
	 * Listados 1. Lista Lazy DataModel 2. Lista Detalles 3. Listas Combo
	 */
	private LazyDataModel<Proyecto> listaProyecto;
	private List<ProdClientes> listaClientes;
	private List<Contratista> listaContratista;
	private List<SeadUsuarios> listaUsuario;
	private List<ProdSucursales> listaSucursales;
	private List<ProdCabeceraProforma> listaProformas;
	private List<SelectItem> listaTipoNegocio;
	private List<ContactoCliente> listaContactoCliente;
	private List<ContactoContratista> listaContactoContratista;

	/**
	 * UI
	 */
	private DataTable dtProyecto;

	/**
	 * PostContrutor
	 */
	@PostConstruct
	public void init() {

		listaProyecto = new LazyDataModel<Proyecto>() {

			private static final long serialVersionUID = 1L;

			@Override
			public List<Proyecto> load(int startIndex, int pageSize, String sortField, SortOrder sortOrder, Map<String, String> filters) {
				List<Proyecto> lista = new ArrayList<Proyecto>();

				boolean ordenar = sortOrder == SortOrder.ASCENDING ? true : false;
				lista = servicioProyecto.obtenerListaPorPagina(startIndex, pageSize, sortField, ordenar, filters);

				listaProyecto.setRowCount(servicioProyecto.contarPorCriterio(filters));

				return lista;
			}
		};

	}

	/**
	 * Metodos
	 */

	/*
	 * (non-Javadoc)
	 * 
	 * @see com.asinfo.as2.controller.PageControllerAS2#editar()
	 */
	public String editar() {
		if (getProyecto().getId() > 0) {
			proyecto = servicioProyecto.cargarDetalle(getProyecto().getId());
			cargarListaContactosClientes();
			cargarListaContactosContratistas();
			setEditado(true);
		} else {
			addInfoMessage("Seleccione un Registro");
		}
		return "";
	}

	/*
	 * (non-Javadoc)
	 * 
	 * @see com.asinfo.as2.controller.PageControllerAS2#guardar()
	 */
	public String guardar() {
		try {
			servicioProyecto.guardar(proyecto);
			addInfoMessage("Registro Guardado Correctamente");
			setEditado(false);
			limpiar();
		} catch (Exception e) {
			addErrorMessage("Error al Guardar el registro");
		}
		return "proyecto.xhtml?faces-redirect=true";
	}

	/*
	 * (non-Javadoc)
	 * 
	 * @see com.asinfo.as2.controller.PageControllerAS2#eliminar()
	 */
	public String eliminar() {
		return "";
	}

	/*
	 * (non-Javadoc)
	 * 
	 * @see com.asinfo.as2.controller.PageControllerAS2#limpiar()
	 */
	@Override
	public String limpiar() {
		idProforma = null;
		idProyecto = null;
		proyecto = null;
		return "";
	}

	/*
	 * (non-Javadoc)
	 * 
	 * @see ec.linde.modulos.proyectos.PageController#cancelar()
	 */
	@Override
	public String cancelar() {
		setEditado(false);
		limpiar();
		return "proyecto.xhtml?faces-redirect=true";
	}

	public String generarPlanOperativo() {
		if (proyecto != null) {
			return "planOperativo.xhtml?faces-redirect=true&idProyecto=" + proyecto.getId();
		} else {
			addInfoMessage("Selccione un registro");
		}
		return "";
	}

	/**
	 * TODO: Agregar descripcion del metodo
	 * 
	 * @return
	 */
	public List<ProyectoContratistaSecundario> getListaProyectoContratistaSecundario() {
		List<ProyectoContratistaSecundario> lista = new ArrayList<ProyectoContratistaSecundario>();
		for (ProyectoContratistaSecundario proyectoContratistaSecundario : proyecto.getListaProyectoContratistaSecundario()) {
			if (!proyectoContratistaSecundario.isEliminado()) {
				lista.add(proyectoContratistaSecundario);
			}
		}
		return lista;
	}

	/**
	 * TODO: Agregar descripcion del metodo
	 * 
	 * @return
	 */
	public List<ProyectoProformaSecundaria> getListaProyectoProformaSecundaria() {
		List<ProyectoProformaSecundaria> lista = new ArrayList<ProyectoProformaSecundaria>();
		for (ProyectoProformaSecundaria proyectoProformaSecundaria : proyecto.getListaProformaSecundarias()) {
			if (!proyectoProformaSecundaria.isEliminado()) {
				lista.add(proyectoProformaSecundaria);
			}
		}
		return lista;
	}

	/**
	 * TODO: Agregar descripcion del metodo
	 */
	public void agregarProyectoContratistaSecundario() {
		ProyectoContratistaSecundario proyectoContratistaSecundario = new ProyectoContratistaSecundario();
		proyectoContratistaSecundario.setProyecto(proyecto);
		proyecto.getListaProyectoContratistaSecundario().add(proyectoContratistaSecundario);
	}

	/**
	 * TODO: Agregar descripcion del metodo
	 */
	public void agregarProyectoProformaSecundaria() {
		ProyectoProformaSecundaria proyectoProformaSecundaria = new ProyectoProformaSecundaria();
		proyectoProformaSecundaria.setProyecto(proyecto);
		proyecto.getListaProformaSecundarias().add(proyectoProformaSecundaria);
	}

	/**
	 * TODO: Agregar descripcion del metodo
	 * 
	 * @param contacto
	 */
	public void eliminarProyectoContratistaSecundario(ProyectoContratistaSecundario proyectoContratistaSecundario) {
		proyectoContratistaSecundario.setEliminado(true);
	}

	/**
	 * TODO: Agregar descripcion del metodo
	 * 
	 * @param contacto
	 */
	public void eliminarProyectoProformaSecundaria(ProyectoProformaSecundaria proyectoProformaSecundaria) {
		proyectoProformaSecundaria.setEliminado(true);
	}

	/**
	 * Get del atributo listaClientes
	 * 
	 * @return el valor del atributo listaClientes
	 */
	public List<ProdClientes> getListaClientes() {
		if (listaClientes == null) {
			try {
				listaClientes = servicioDatosBaseProyectos.getObtenerClientes();
			} catch (Exception e) {
				e.printStackTrace();
			}
		}
		return listaClientes;
	}

	/**
	 * Get del atributo listaContratista
	 * 
	 * @return el valor del atributo listaContratista
	 */
	public List<Contratista> getListaContratista() {
		if (listaContratista == null) {
			listaContratista = servicioContratista.obtenerListaCombo("nombre", true, null);
		}
		return listaContratista;
	}

	/**
	 * Get del atributo listaUsuario
	 * 
	 * @return el valor del atributo listaUsuario
	 */
	public List<SeadUsuarios> getListaUsuario() {
		if (listaUsuario == null) {
			listaUsuario = servicioDatosBaseProyectos.getObtenerUsuarios();
		}
		return listaUsuario;
	}

	/**
	 * Get del atributo listaSucursales
	 * 
	 * @return el valor del atributo listaSucursales
	 */
	public List<ProdSucursales> getListaSucursales() {
		if (listaSucursales == null) {
			listaSucursales = servicioDatosBaseProyectos.getObtenerSucucursal();
		}
		return listaSucursales;
	}

	/**
	 * TODO: Agregar descripcion del metodo
	 * 
	 * @return
	 */
	public List<ProdCabeceraProforma> getListaProformas() {
		if (listaProformas == null) {
			listaProformas = servicioDatosBaseProyectos.getObtenerProformas();
		}
		return listaProformas;
	}

	/**
	 * Get del atributo listaTipoNegocio
	 * 
	 * @return el valor del atributo listaTipoNegocio
	 */
	public List<SelectItem> getListaTipoNegocio() {
		if (listaTipoNegocio == null) {
			listaTipoNegocio = new ArrayList<SelectItem>();
			listaTipoNegocio.add(new SelectItem(null, "Seleccione.."));
			for (TipoNegocio tipoNegocio : TipoNegocio.values()) {
				listaTipoNegocio.add(new SelectItem(tipoNegocio, tipoNegocio.getNombre()));
			}
		}
		return listaTipoNegocio;
	}

	/**
	 * 
	 */
	public void cargarListaContactosContratistas() {
		if (getProyecto().getContratista() != null) {
			HashMap<String, String> filters = new HashMap<String, String>();
			filters.put("contratista.idContratista", getProyecto().getContratista().getId() + "");
			listaContactoContratista = servicioContactoContratista.obtenerListaCombo("nombre", true, filters);
		}
	}

	/**
	 * 
	 */
	public void cargarListaContactosClientes() {
		if (getProyecto().getCliente() != null) {
			listaContactoCliente = servicioContactoCliente.obtenerContactoClientePorCliente(getProyecto().getCliente().getClieId());
		}
	}

	/**
	 * TODO: Agregar descripcion del metodo
	 */
	public void cargarProyectoDesdeProforma() {
		if (idProforma != null && proyecto == null) {

			Proyecto proyecto = servicioProyecto.obtenerProyecto(idProforma);

			if (proyecto == null) {

				ProdCabeceraProforma proforma = servicioDatosBaseProyectos.cargarDetalleProforma(idProforma);
				this.proyecto = new Proyecto();
				this.proyecto.setProforma(proforma);
				this.proyecto.setFecha(new Date());
				this.proyecto.setUsuario(proforma.getSeadUsuarios());
				this.proyecto.setPersona(proforma.getProdPersonas());
				this.proyecto.setCliente(proforma.getProdClientes());
				this.proyecto.setUsuario(proforma.getSeadUsuarios());
				cargarListaContactosClientes();
				cargarListaContactosContratistas();
				setEditado(true);

			} else {
				this.proyecto = servicioProyecto.cargarDetalle(proyecto.getIdProyecto());
				idProforma = null;
				cargarListaContactosClientes();
				cargarListaContactosContratistas();
				setEditado(true);
			}
		}
	}

	/**
	 * Metodos Eventos
	 */

	/**
	 * Metodos GET Y SET
	 */

	/**
	 * Get del atributo proyecto
	 * 
	 * @return el valor del atributo proyecto
	 */
	public Proyecto getProyecto() {
		return proyecto;
	}

	/**
	 * Set del atributo proyecto
	 * 
	 * @param proyecto
	 *            valor para asignar al atributo proyecto
	 */
	public void setProyecto(Proyecto proyecto) {
		this.proyecto = proyecto;
	}

	/**
	 * Get del atributo proforma
	 * 
	 * @return el valor del atributo proforma
	 */
	public Integer getIdProforma() {
		return idProforma;
	}

	/**
	 * Set del atributo proforma
	 * 
	 * @param proforma
	 *            valor para asignar al atributo proforma
	 */
	public void setIdProforma(Integer idProforma) {
		this.idProforma = idProforma;
	}

	/**
	 * @return
	 */
	public Integer getIdProyecto() {
		return idProyecto;
	}

	/**
	 * @param idProyecto
	 */
	public void setIdProyecto(Integer idProyecto) {
		this.idProyecto = idProyecto;
	}

	/**
	 * @return
	 */
	public List<ContactoCliente> getListaContactoCliente() {
		return listaContactoCliente;
	}

	/**
	 * @param listaContactoCliente
	 */
	public void setListaContactoCliente(List<ContactoCliente> listaContactoCliente) {
		this.listaContactoCliente = listaContactoCliente;
	}

	/**
	 * @return
	 */
	public List<ContactoContratista> getListaContactoContratista() {
		return listaContactoContratista;
	}

	/**
	 * @param listaContactoContratista
	 */
	public void setListaContactoContratista(List<ContactoContratista> listaContactoContratista) {
		this.listaContactoContratista = listaContactoContratista;
	}

	/**
	 * Get del atributo listaProyecto
	 * 
	 * @return el valor del atributo listaProyecto
	 */
	public LazyDataModel<Proyecto> getListaProyecto() {
		return listaProyecto;
	}

	/**
	 * Set del atributo listaProyecto
	 * 
	 * @param listaProyecto
	 *            valor para asignar al atributo listaProyecto
	 */
	public void setListaProyecto(LazyDataModel<Proyecto> listaProyecto) {
		this.listaProyecto = listaProyecto;
	}

	/**
	 * Get del atributo dtProyecto
	 * 
	 * @return el valor del atributo dtProyecto
	 */
	public DataTable getDtProyecto() {
		return dtProyecto;
	}

	/**
	 * Set del atributo dtProyecto
	 * 
	 * @param dtProyecto
	 *            valor para asignar al atributo dtProyecto
	 */
	public void setDtProyecto(DataTable dtProyecto) {
		this.dtProyecto = dtProyecto;
	}

}
